from app.models.met import Mets
from app.models.workout_record import WorkoutRecord

from app import db

class SportService:
    def __init__(self):
        pass

    def getAllMets(self):
        """获取所有 MET 信息"""
        try:
            mets = Mets.query.all()  # 获取所有 MET 数据
            mets_list = []
            for met in mets:
                mets_list.append({
                    'value': met.met_id,
                    'label': met.workout_type,
                    'content': f"{met.intensity}",
                    'met_value': met.met_value
                })  # 将查询结果转为字典格式
            return mets_list
        except Exception as e:
            return {"error": str(e)}, 500


    def getUserMets(self, user_id):
        """根据用户的运动记录返回 MET 数据，按运动类型出现次数排序，并插入其他活动"""
        try:
            # 查询用户的所有运动记录
            workout_records = WorkoutRecord.query.filter_by(user_id=user_id).all()

            # 统计每种运动类型的次数
            workout_count = {}
            for record in workout_records:
                workout_type = record.workout_type  # 获取运动类型
                if workout_type not in workout_count:
                    workout_count[workout_type] = 0
                workout_count[workout_type] += 1

            # 获取所有 MET 数据，只查询在用户运动记录中出现过的运动类型
            mets = Met.query.filter(Met.workout_type.in_(workout_count.keys())).all()

            # 将 MET 数据按次数进行排序，次数多的排在前面
            sorted_mets = sorted(mets, key=lambda met: workout_count[met.workout_type], reverse=True)

            # 获取所有其他活动类型（未出现在历史记录中的活动）
            all_mets = Met.query.all()
            other_mets = [met for met in all_mets if met.workout_type not in workout_count]

            # 将历史记录中的活动和其他活动合并，历史记录活动排在前面
            final_mets = sorted_mets + other_mets

            # 返回合并后的 MET 数据
            met_list = [met.to_dict() for met in final_mets]
            return met_list
        except Exception as e:
            return {"error": str(e)}, 500


